package week04.homework01MazeGame.model.role;

/**
 * @author li
 * 基础角色类，包含角色的基本属性和行为
 */
public abstract class BaseRole {

    /**
     * 角色的基础属性
     */
    private int health;
    private int defense;
    private int attack;

    /**
     * 构造函数，初始化角色的基本属性
     * @param health 角色的初始血量
     * @param defense 角色的初始防御值
     * @param attack 角色的初始攻击值
     */
    public BaseRole(int health, int defense, int attack) {
        this.health = health;
        this.defense = defense;
        this.attack = attack;
    }

    /**
     * 攻击方法，对目标角色造成伤害
     * @param target 被攻击的目标角色
     */
    public void attack(BaseRole target) {
        int damage = Math.max(1, this.attack - target.getDefense());
        System.out.println(this.getClass().getSimpleName() + " 攻击 " + target.getClass().getSimpleName() + "，造成 " + damage + " 点伤害");
        target.takeDamage(damage);
    }

    /**
     * 攻击方法，对目标角色造成指定的伤害
     * @param target 被攻击的目标角色
     * @param damage 攻击造成的伤害值
     */
    public void attack(BaseRole target, int damage) {
        damage = Math.max(1, damage - target.getDefense());
        System.out.println(this.getClass().getSimpleName() + " 攻击 " + target.getClass().getSimpleName() + "，造成 " + damage + " 点伤害");
        target.takeDamage(damage);
    }

    /**
     * 防御方法，角色受到伤害时，根据防御值减少实际受到的伤害
     * @param damage 受到的伤害值
     */
    public void takeDamage(int damage) {
        this.health = Math.max(0, this.health - damage);
    }

    /**
     * Getter 和 Setter 方法
     */
    public int getHealth() {
        return health;
    }

    public void addHealth(int health) {
        this.health += health;
    }

    public int getDefense() {
        return defense;
    }

    public void addDefense(int defense) {
        this.defense += defense;
    }

    public int getAttack() {
        return attack;
    }

    public void addAttack(int attack) {
        this.attack += attack;
    }

    public abstract void showMessage();

}